package com.cat.orm.core.db.repository;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 异步的仓库接口
 * @author Jeremy Feng
 * @date 2024/9/13 18:01
 */
public interface IAsyncRepository<V> {

    /**
     * 通过类对象, 查询复合条件的数据信息
     * @date 2024年8月30日
     * @return 异步结果返回
     */
    public CompletableFuture<V> selectByPrimaryKey(Object key);

    /**
     * 查询所有, 查询出来的同步缓存到cache
     * @date 2024年8月30日
     * @return 异步结果返回
     */
    public CompletableFuture<List<V>> selectAll();

    /**
     * 查询玩家信息, 通过默认索引,这种方式的实现, 默认直接获取缓存的sql进行查询
     * @date 2024年8月30日
     * @return 异步结果返回
     */
    public CompletableFuture<List<V>> selectByIndex(Object[] objs);

    /**
     * 通过指定字段查询数据,这种方式只能通过sql组装进行查询
     * @date 2024年8月30日
     * @return 异步结果返回
     */
    public CompletableFuture<List<V>> selectByIndex(String[] props, Object[] objs);

    /**
     * 添加玩家信息. 如果有主键, 更新主键缓存. 如有索引缓存也需要更新.
     * @date 2024年8月30日
     * @param po 插入对象
     */
    public CompletableFuture<Void> insert(V po);

    /**
     * 添加数据信息
     * @date 2024年8月30日
     * @param po 替换对象
     */
    public CompletableFuture<Void> replace(V po);

    /**
     * 修改数据
     * @date 2024年8月30日
     * @param po 要修改对象
     */
    public CompletableFuture<Void> update(V po);

    /**
     * 批量添加, 更新主键缓存, 索引缓存无效
     *
     * @date 2024年8月30日
     * @param basePos 要保存集合
     */
    public CompletableFuture<int[]> insertBatch(Collection<V> basePos);

    /**
     * 批量修改玩家信息, 实现默认数据分类
     * @date 2024年8月30日
     * @param basePos 要修改的集合
     */
    public CompletableFuture<int[]> updateBatch(Collection<V> basePos);

    /**
     * 删掉数据
     * @date 2024年8月30日
     * @param po 删除的对象
     */
    public CompletableFuture<Integer> delete(V po);

    /**
     * 删除所有, 复合类对象信息, 全部删除
     * @date 2024年8月30日
     */
    public CompletableFuture<Integer> deleteAll();

    /**
     * 批量删除, 批量删除指定集合内的数据信息
     * @date 2024年8月30日
     * @param basePos 数据集合
     */
    public CompletableFuture<int[]> deleteBatch(Collection<V> basePos);

}
